iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0
自我挑戰組

從0到有學習JavaScript系列 第 26

第三章 型別、值和變數-問題筆記 symbols part1

  • 分享至 

  • xImage
  •  

一、symbol是什麼?

  1. ES6才有的,作為非字串的特性名稱(non-string property names)之用。
  2. 在 ES5 中,object 的屬性 (property) 只能是字串,如果你要幫一個 object 添加新的屬性,很容易會造成名稱衝突,Symbol 就是用來解決這件事情的。也就是說,object property name 現在可以有兩種型態 - 字串和 Symbol。

創建symbol值:

const sym1 = Symbol();
const sym2 = Symbol("foo");
const sym3 = Symbol("foo");

接續上一題,每一個symbol都是唯一的,請看下面示範:

sym2 === sym3;  //false
Symbol("foo") === Symbol("foo");    //false

因為每個 Symbol 都是唯一的,所以可以使用它們作為唯一屬性名稱,這在防止名稱衝突或屬性覆蓋方面非常有用。

二、全域的Symbol註冊狀態(global Symbol registry)是什麼?
global Symbol registry是一個虛構的概念,它可能不對應 JavaScript 引擎內部的任何實際資料結構。藉由 Symbol.for() 和 Symbol.keyFor() 這兩個方法,才能取得global Symbol registry。

  • Symbol.for(key) 用來取得名稱為 key (字串) 的 global Symbol,如果不存在則會先建立一個新的存到 global symbol registry 後再返回。
  • Symbol.keyFor(sym) 用來取得某個 global Symbol 的 key 名稱。
let s = Symbol.for("shared");
let t = Symbol.for("shared");
Symbol.keyFor(t);          //"shared"

  • Symbol.for()Symbol()完全不同,Symbol()永遠不會重複回傳相同的值(上面有提到),但Symbol.for() 以相同字串被呼叫時,一定會回傳相同的值。

Symbol.for() 以相同字串被呼叫時,一定會回傳相同的值:

let s = Symbol.for("shared");
let t = Symbol.for("shared");
s===t;        //true

如果是Symbol() ,就不會相等:

Symbol("good") === Symbol("good");     //false
  • 傳入到Symbol.for()的字串,可以經由所回傳的Symbol的toString()輸出中得到:
let s = Symbol.for("shared");

s.toString();                  //"Symbol(shared)"

使用Symbol.keyFor()取出Symbol.for()中的字串,且兩者相等:

Symbol.keyFor(Symbol.for("tokenString")) === "tokenString"; // true

三、javaScript的object中的特性(包含一個名稱、一個值),是一種無序群集(unordered collection),無序群集是什麼?

// 創建一個 JavaScript 物件,其中特性之間的關係是無順序的
const myObject = {
  name: "John",
  age: 30,
  city: "New York"
};

// 取出object內的值
console.log(myObject.name); // "John"
console.log(myObject.age);  // 30

// 重複的鍵會覆蓋之前的值
myObject.name = "Alice";
console.log(myObject.name); // "Alice"已經覆蓋掉 "John"

Reference
https://www.fooish.com/javascript/ES6/Symbol.html
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol


上一篇
第三章 型別、值和變數-問題筆記 undefined typeof void
下一篇
第三章 型別、值和變數-問題筆記 symbols part2
系列文
從0到有學習JavaScript31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言